package com.huida.app.handler;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.huida.app.entity.AjaxResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Description: 自定义登录成功的结果处理
 * @Author: Wangzz
 * @Version: 1.0.0
 * @CreateDate: Created in 2021/10/31 22:11
 * @UpdateDate: [dateFormat:YYYY-MM-DD][modifier][description]
 */

/*
* AuthenticationSuccessHandler接口是Security提供的认证成功处理器接口，我们只需要去实现它即可。但是通常来说，我们不会直接去实现AuthenticationSuccessHandler接口，而是继承SavedRequestAwareAuthenticationSuccessHandler 类，
* 这个类会记住用户上一次请求的资源路径，比如：用户请求books.html，没有登陆所以被拦截到了登录页，
* 当你万成登陆之后会自动跳转到books.html，而不是主页面。
* */

@Component
public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

    // 在application配置文件中配置登录的类型是JSON数据响应还是做页面响应
    @Value("${spring.security.loginType}")
    private String loginType;

    // Jackson JSON数据处理类
    private static ObjectMapper objectMapper = new ObjectMapper();

    /*
        在上面的自定义登陆成功处理中，既适应JSON前后端分离的应用登录结果处理，也适用于模板页面跳转应用的登录结果处理
        ObjectMapper 是Spring Boot默认集成的JSON数据处理类库Jackson中的类。
        AjaxResponse是一个自定义的通用的JSON数据接口响应类。
    * */
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
        if(loginType.equalsIgnoreCase("JSON")){
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write(objectMapper.writeValueAsString(AjaxResponse.success()));
        }else{
            // 跳转到上次请求的页面上
            super.onAuthenticationSuccess(request, response, authentication);
        }
    }
}
